package main

import (
	"GoodOrder/global"
	"GoodOrder/initialize"
	"GoodOrder/utils"
	"flag"
	"fmt"
	"github.com/hashicorp/consul/api"
	uuid "github.com/satori/go.uuid"
	"go.uber.org/zap"
	"google.golang.org/grpc"
	"google.golang.org/grpc/health"
	"google.golang.org/grpc/health/grpc_health_v1"
	"net"
)

//// 仅代表es分词
//const TestData = `{
//	"mappings":{
//		"properties":{
//			"name":{
//				"type":"text",
//				"analyzer":"ik_max_word"
//			},
//			"id":{
//				"type":"integer"
//			}
//		}
//	}
//}`
//
//type EsData struct {
//	Name    string
//	Age     int32
//	Hobbies string
//}

func main() {
	IP := flag.String("ip", "0.0.0.0", "ip地址")
	Port := flag.Int("port", 8886, "端口")
	//初始化logger
	initialize.InitLogger()
	//初始化配置 nocs
	initialize.InitConfig()
	//初始化es
	initialize.InitEs()
	////搜索取值
	//q := elastic.NewMatchQuery("name", "Jim")
	//result, err := global.Es.Search("matchtest").Query(q).Do(context.Background())
	//if err != nil {
	//	zap.S().Info("失败")
	//}
	//Total := result.Hits.TotalHits.Value
	//zap.S().Info("Es数量：：：", Total)
	//for _, value := range result.Hits.Hits {
	//	//原始的es取值 返回的是json数据
	//	//if jsonData, err := value.Source.MarshalJSON(); err == nil {
	//	//	zap.S().Info("结果:::", string(jsonData))
	//	//}
	//	esData := EsData{}
	//	json.Unmarshal(value.Source, &esData)
	//	zap.S().Info("Json转义结构体:::", esData)
	//
	//}
	//esData := EsData{Name: "🐶", Age: 25, Hobbies: "sm"}
	// 代号
	//姜汪汪 🐶 （老虎）
	//于成龙 🐍 （刀龙）
	//诸海鹏 🐒 （大马猴）
	//宋军建 🐎 (千里马)
	//代俊杰 🐮（屌丝牛马）
	//宗伟   🐔 （鸡哥）
	//李风国 🐷 （GGBoy）
	// 🤵      （GoodMan）
	//resultData, _ := global.Es.Index().Index("于成🐍").BodyJson(esData).Do(context.Background())
	//arr, _ := global.Es.CreateIndex("2104A").BodyString(TestData).Do(context.Background())
	//zap.S().Info("创建的索引:::", arr)
	//zap.S().Info("返回值：：：", resultData)
	//初始化DB
	initialize.InitDB()
	//注册consul
	zap.S().Info(global.ServerConfig)
	//实例化

	flag.Parse()
	zap.S().Info("ip: ", *IP)
	if *Port == 0 {
		*Port, _ = utils.GetFreePort()
	}

	zap.S().Info("port: ", *Port)

	server := grpc.NewServer()
	//proto.RegisterUserServer(server, &handler.UserServer{})
	lis, err := net.Listen("tcp", fmt.Sprintf("%s:%d", *IP, *Port))
	if err != nil {
		panic("failed to listen:" + err.Error())
	}
	serviceID := fmt.Sprintf("%s", uuid.NewV4())
	//1.服务名称--自定义 2.调用uuid包自动生成的 3.本地服务的端口 4.标签--自定义 5.本地地址 --IP地址
	registerGrpcToConsul(global.ServerConfig.Name, serviceID, *Port, []string{"OrderSrv", "Srv"}, "127.0.0.1")
	err = server.Serve(lis)
	if err != nil {
		panic("failed to start grpc:" + err.Error())
	}

}

// grpc服务注册consul
func registerGrpcToConsul(Name string, serviceID string, Port int, Tags []string, Address string) {
	cfg := api.DefaultConfig()
	cfg.Address = fmt.Sprintf("%s:%d", global.ServerConfig.ConsulInfo.Host,
		global.ServerConfig.ConsulInfo.Port)

	client, err := api.NewClient(cfg)
	if err != nil {
		panic(err)
	}
	//注册服务健康检查
	server := grpc.NewServer()
	grpc_health_v1.RegisterHealthServer(server, health.NewServer())

	//服务注册

	////生成对应的检查对象
	//check := &api.AgentServiceCheck{
	//	GRPC:                           fmt.Sprintf("%s:%d", Address, Port),
	//	Timeout:                        "5s",
	//	Interval:                       "5s",
	//	DeregisterCriticalServiceAfter: "15s",
	//}

	//生成注册对象
	registration := new(api.AgentServiceRegistration)
	registration.Name = Name
	registration.ID = serviceID
	registration.Port = Port
	registration.Tags = Tags
	registration.Address = Address
	//registration.Check = check
	//1. 如何启动两个服务
	//2. 即使我能够通过终端启动两个服务，但是注册到consul中的时候也会被覆盖
	err = client.Agent().ServiceRegister(registration)
	if err != nil {
		panic(err)
	}
}
